Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.ComponentModel
Imports System.Drawing.Design
Imports System
Imports System.Web
Imports System.ComponentModel.Design
Imports System.Reflection
Imports System.Web.HttpContext
Imports System.Collections

Public Class GridBusca
    Inherits CompositeControl
    Implements INamingContainer

    Protected WithEvents gvGrid As New GridView
    Protected WithEvents tab As New HtmlControls.HtmlTable
    Protected WithEvents pnl As New Panel

    Private bolExibirBotaoBusca As Boolean = True

    Private arrColunas As New ColecaoColunas
    Private arrParametros As New ColecaoParametros
    Private arrControlesDestinos As New ColecaoControles

    Private strClasseCarga As String = String.Empty
    Private strMetodoListagem As String = String.Empty

    Private strDataTable As String = String.Empty
    Private strLargura, strAltura As Unit

    Private objDataSource As Object
    Private objDataTableSource As DataTable

    Private WithEvents btnBuscar As New Button
    Private WithEvents lblMensagem As New Label

    Private arrBotoes As New ColecaoBotoes
    Public Event GridBuscaBotaoComando(ByVal NomeComando As String)


#Region "Propriedades"

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
  Editor(GetType(ColecaoParametrosEditor), GetType(System.Drawing.Design.UITypeEditor)), _
  PersistenceMode(PersistenceMode.InnerProperty)> _
 Public ReadOnly Property Parametros() As ColecaoParametros
        Get
            EnsureChildControls()
            Return Me.arrParametros
        End Get

    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
      Editor(GetType(ColecaoColunasEditor), GetType(System.Drawing.Design.UITypeEditor)), _
      PersistenceMode(PersistenceMode.InnerProperty)> _
     Public ReadOnly Property Colunas() As ColecaoColunas
        Get
            EnsureChildControls()
            Return Me.arrColunas
        End Get

    End Property

    Public ReadOnly Property ControlesDestinos() As ColecaoControles
        Get
            Return Me.arrControlesDestinos
        End Get
    End Property

    Public Property ClasseCarga() As String
        Get
            Return strClasseCarga
        End Get
        Set(ByVal value As String)
            strClasseCarga = value
        End Set
    End Property

    Public Property MetodoListagem() As String
        Get
            Return strMetodoListagem
        End Get
        Set(ByVal value As String)
            strMetodoListagem = value
        End Set
    End Property


    Public Property DataSource() As Object
        Get
            Return Me.objDataSource
        End Get
        Set(ByVal value As Object)
            Me.objDataSource = value
        End Set
    End Property

    Public Property DataTable() As String
        Get
            Return strDataTable
        End Get
        Set(ByVal value As String)
            strDataTable = value
        End Set
    End Property

    Public Property Grid() As GridView
        Get
            Return Me.gvGrid
        End Get
        Set(ByVal value As GridView)
            Me.gvGrid = value
        End Set
    End Property

    Public Property TextoBotaoBuscar() As String
        Get
            Return btnBuscar.Text
        End Get
        Set(ByVal value As String)
            btnBuscar.Text = value
        End Set
    End Property

    Public Property CssClassBotaoBuscar() As String
        Get
            Return btnBuscar.CssClass
        End Get
        Set(ByVal value As String)
            btnBuscar.CssClass = value
        End Set
    End Property

    Public Overrides Property CssClass() As String
        Get
            Return Me.gvGrid.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.CssClass = value
        End Set
    End Property
    Public Property HeaderCssClass() As String
        Get
            Return Me.gvGrid.HeaderStyle.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.HeaderStyle.CssClass = value
        End Set
    End Property

    Public Property FooterCssClass() As String
        Get
            Return Me.gvGrid.FooterStyle.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.FooterStyle.CssClass = value
        End Set
    End Property

    Public Property RowCssClass() As String
        Get
            Return Me.gvGrid.RowStyle.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.RowStyle.CssClass = value
        End Set
    End Property


    Public Property AlternateRowCssClass() As String
        Get
            Return Me.gvGrid.AlternatingRowStyle.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.AlternatingRowStyle.CssClass = value
        End Set
    End Property

    Public Property EditRowCssClass() As String
        Get
            Return Me.gvGrid.EditRowStyle.CssClass
        End Get
        Set(ByVal value As String)
            Me.gvGrid.EditRowStyle.CssClass = value
        End Set
    End Property


    Public Property ExibirBotaoBusca() As Boolean
        Get
            Return Me.bolExibirBotaoBusca
        End Get
        Set(ByVal value As Boolean)
            bolExibirBotaoBusca = value
        End Set
    End Property

    Public Overrides Property Width() As Unit
        Get
            Return Me.strLargura
        End Get
        Set(ByVal value As Unit)
            Me.strLargura = value
        End Set
    End Property

    Public Overrides Property Height() As Unit
        Get
            Return Me.strAltura
        End Get
        Set(ByVal value As Unit)
            Me.strAltura = value
        End Set
    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
Editor(GetType(ColecaoBotoesEditor), GetType(System.Drawing.Design.UITypeEditor)), _
PersistenceMode(PersistenceMode.InnerProperty)> _
Public ReadOnly Property BotoesAuxiliares() As ColecaoBotoes
        Get
            EnsureChildControls()
            Return Me.arrBotoes
        End Get

    End Property
#End Region


    Protected Overrides Sub CreateChildCOntrols()


        If strLargura = Nothing Then
            strLargura = Unit.Pixel(600)
        End If
        If strAltura = Nothing Then
            strAltura = Unit.Pixel(300)
        End If

        Me.gvGrid.AutoGenerateColumns = False

        Me.Controls.Add(tab)

        pnl = New Panel
        pnl.Controls.Add(Me.gvGrid)

        pnl.Width = strLargura
        pnl.Height = strAltura


        Me.Controls.Add(pnl)

    End Sub

    Protected Overrides Sub render(ByVal writer As HtmlTextWriter)


        EnsureChildControls()

        RenderChildren(writer)


    End Sub

    Protected Overrides Sub LoadViewState(ByVal savedState As Object)

        MyBase.LoadViewState(savedState(0))

        Dim dadosViewState() As Object

        dadosViewState = savedState(1)

        Me.strClasseCarga = dadosViewState(0)
        Me.strMetodoListagem = dadosViewState(1)
        Me.strDataTable = dadosViewState(2)

    End Sub

    Protected Overrides Function SaveViewState() As Object

        Dim savedState(1) As Object

        savedState(0) = MyBase.SaveViewState()

        Dim dadosViewState(6) As Object

        dadosViewState(0) = Me.strClasseCarga
        dadosViewState(1) = Me.strMetodoListagem
        dadosViewState(2) = Me.strDataTable

        savedState(1) = dadosViewState
        Return savedState


    End Function

    Private Sub CarregarBotoesAuxiliares(ByRef cell As HtmlTableCell)

        For Each B As ItemBotao In Me.arrBotoes

            Dim btnCmd As New Button

            btnCmd.Text = B.Titulo
            btnCmd.CommandName = B.Comando
            btnCmd.CssClass = btnBuscar.CssClass
            AddHandler btnCmd.Command, AddressOf btnAuxiliar_Command

            Dim espaco As New HtmlGenericControl
            espaco.InnerHtml = "&nbsp;&nbsp;"

            cell.Controls.Add(espaco)
            cell.Controls.Add(btnCmd)

        Next

    End Sub

    Private Sub btnAuxiliar_Command(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)

        RaiseEvent GridBuscaBotaoComando(e.CommandName)

    End Sub

    Private Sub AtualizarEstruturaGrid()


        If Not Me.DesignMode Then

            For Each Col As ItemColuna In Me.arrColunas


                Dim BF As New TemplateField

                If Col.TipoControle = eTipoObjetoBusca.TextBoxCarga And Not Col.ExibirLink Then

                    BF.HeaderTemplate = New TextBoxCargaTemplateField(ListItemType.Header, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.MascaraInput, Col.Obrigatorio, Col.ValorDefault, Col.QuantidadeLinhas, False, Col.ListaOpcoes)
                    BF.ItemTemplate = New TextBoxCargaTemplateField(ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.MascaraInput, Col.Obrigatorio, Col.ValorDefault, Col.QuantidadeLinhas, False)
                    BF.FooterTemplate = New TextBoxCargaTemplateField(ListItemType.Footer, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.MascaraInput, Col.Obrigatorio, Col.ValorDefault, Col.QuantidadeLinhas, False, Col.ListaOpcoes)

                    If Col.PermiteEdicao Then
                        BF.EditItemTemplate = New TextBoxCargaTemplateField(ListItemType.EditItem, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.EditItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.MascaraInput, Col.Obrigatorio, Col.ValorDefault, Col.QuantidadeLinhas, False, Col.ListaOpcoes)
                    Else
                        BF.EditItemTemplate = New TextBoxCargaTemplateField(ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.MascaraInput, Col.Obrigatorio, Col.ValorDefault, Col.QuantidadeLinhas, False, Col.ListaOpcoes)
                    End If


                ElseIf Col.TipoControle = eTipoObjetoBusca.TextBoxCarga And Col.ExibirLink Then


                    BF.HeaderTemplate = New LinkCargaTemplateField(Me.Page, ListItemType.Header, Col.Cabecalho, Col.NomeColuna, Col.NomeColuna1, Col.NomeColuna2, Col.NomeColunaEdicao, Col.URL, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.Obrigatorio, Col.TextoFixoLink, Col.NomePropriedade1, Col.NomePropriedade2, Col.NomePropriedade3, Col.PermiteEdicao, Col.ListaOpcoes)
                    BF.ItemTemplate = New LinkCargaTemplateField(Me.Page, ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColuna1, Col.NomeColuna2, Col.NomeColunaEdicao, Col.URL, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.Obrigatorio, Col.TextoFixoLink, Col.NomePropriedade1, Col.NomePropriedade2, Col.NomePropriedade3, Col.PermiteEdicao, Col.ListaOpcoes)

                    BF.EditItemTemplate = New LinkCargaTemplateField(Me.Page, ListItemType.EditItem, Col.Cabecalho, Col.NomeColuna, Col.NomeColuna1, Col.NomeColuna2, Col.NomeColunaEdicao, Col.URL, Col.Largura, Col.EditItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.Obrigatorio, Col.TextoFixoLink, Col.NomePropriedade1, Col.NomePropriedade2, Col.NomePropriedade3, Col.PermiteEdicao, Col.ListaOpcoes)

                ElseIf Col.TipoControle = eTipoObjetoBusca.DropDownListCarga Then

                    BF.HeaderTemplate = New DropDownListCargaTemplateField(ListItemType.Header, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.MetodoCargaListaOpcoes, Col.ListaOpcoes, Col.DataTableCargaListaOpcoes, Col.CampoValorCargaListaOpcoes, Col.CampoTextoCargaListaOpcoes, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao)
                    BF.ItemTemplate = New DropDownListCargaTemplateField(ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.MetodoCargaListaOpcoes, Col.ListaOpcoes, Col.DataTableCargaListaOpcoes, Col.CampoValorCargaListaOpcoes, Col.CampoTextoCargaListaOpcoes, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao)
                    BF.EditItemTemplate = New DropDownListCargaTemplateField(ListItemType.EditItem, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.MetodoCargaListaOpcoes, Col.ListaOpcoes, Col.DataTableCargaListaOpcoes, Col.CampoValorCargaListaOpcoes, Col.CampoTextoCargaListaOpcoes, Col.Largura, Col.EditItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao)


                ElseIf Col.TipoControle = eTipoObjetoBusca.FileUpload Then

                    BF.HeaderTemplate = New UploadTemplateField(ListItemType.Header, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.URL, Col.TextoFixoLink, Col.NomeColunaNomeArquivo, Col.Obrigatorio)
                    BF.ItemTemplate = New UploadTemplateField(ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.URL, Col.TextoFixoLink, Col.NomeColunaNomeArquivo, Col.Obrigatorio)
                    BF.FooterTemplate = New UploadTemplateField(ListItemType.Footer, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.HeaderCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.URL, Col.TextoFixoLink, Col.NomeColunaNomeArquivo, Col.Obrigatorio)

                    If Col.PermiteEdicao Then
                        BF.EditItemTemplate = New UploadTemplateField(ListItemType.EditItem, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.EditItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.URL, Col.TextoFixoLink, Col.NomeColunaNomeArquivo, Col.Obrigatorio)
                    Else
                        BF.EditItemTemplate = New UploadTemplateField(ListItemType.Item, Col.Cabecalho, Col.NomeColuna, Col.NomeColunaEdicao, Col.TipoDado, Col.TamanhoMaximo, Col.Largura, Col.ItemCssClass, Col.AlinhamentoHorizontal, Col.AlinhamentoVertical, Col.FormatoApresentacao, Col.URL, Col.TextoFixoLink, Col.NomeColunaNomeArquivo, Col.Obrigatorio)
                    End If

                End If

                Me.gvGrid.Columns.Add(BF)

            Next

            Me.ContinuaAtualizarEstruturaGrid()


        End If

    End Sub


    Private Sub ContinuaAtualizarEstruturaGrid()
        If Not Me.DesignMode Then


            Dim MaxCol As Long
            Dim MaxLin As Long

            For Each Par As ItemParametro In Me.arrParametros

                If Par.Linha > MaxLin Then
                    MaxLin = Par.Linha
                End If

                If Par.Coluna > MaxCol Then
                    MaxCol = Par.Coluna
                End If

            Next

            For ilinha As Long = 0 To MaxLin

                tab.Rows.Add(New HtmlControls.HtmlTableRow)

                For icol As Long = 0 To MaxCol
                    Dim tabcell As New HtmlTableCell
                    tabcell.VAlign = "top"
                    tabcell.Align = "left"
                    tab.Rows(ilinha).Cells.Add(tabcell)
                Next

            Next

            For Each Par As ItemParametro In Me.arrParametros

                Select Case Par.TipoObjeto

                    Case eTipoObjetoBusca.TextBoxCarga

                        Dim txt As New TextBoxCarga

                        txt.LarguraTitulo = Par.LarguraTitulo
                        txt.ID = Par.NomeParametro
                        txt.TipoValor = Par.TipoValor
                        txt.Titulo = Par.Titulo
                        txt.CssClass = Par.CssClass
                        txt.PosicaoTitulo = Par.PosicaoTitulo
                        txt.Width = Par.LarguraControle
                        txt.Obrigatorio = Par.Obrigatorio
                        txt.Text = Par.ValorPadrao
                        txt.TituloCssClass = Par.TituloCssClass
                        tab.Rows(Par.Linha - 1).Cells(Par.Coluna - 1).Controls.Add(txt)

                    Case eTipoObjetoBusca.DropDownListCarga

                        Dim ddl As New DropDownListCarga
                        ddl.ID = Par.NomeParametro
                        ddl.TipoValor = Par.TipoValor
                        ddl.Titulo = Par.Titulo
                        ddl.TituloCssClass = Par.TituloCssClass
                        ddl.CssClass = Par.CssClass
                        ddl.LarguraTitulo = Par.LarguraTitulo
                        ddl.PosicaoTitulo = Par.PosicaoTitulo
                        ddl.Width = Par.LarguraControle
                        ddl.Obrigatorio = Par.Obrigatorio

                        For Each IC As ItemCarga In Par.OpcoesToItemCarga(Par.ListaOpcoes)

                            ddl.Itens.Add(IC)

                        Next

                        If Par.ValorPadrao <> String.Empty Then
                            ddl.ValorSelecionado = Par.ValorPadrao
                        End If

                        tab.Rows(Par.Linha - 1).Cells(Par.Coluna - 1).Controls.Add(ddl)


                    Case eTipoObjetoBusca.CheckBoxCarga

                        Dim chk As New CheckBoxCarga
                        chk.ID = Par.NomeParametro
                        chk.TipoValor = Par.TipoValor
                        chk.Titulo = Par.Titulo
                        chk.TituloCssClass = Par.TituloCssClass
                        chk.CssClass = Par.CssClass
                        chk.LarguraTitulo = Par.LarguraTitulo
                        chk.PosicaoTitulo = Par.PosicaoTitulo
                        chk.Width = Par.LarguraControle
                        chk.Obrigatorio = Par.Obrigatorio

                        For Each IC As ItemCarga In Par.OpcoesToItemCarga(Par.ListaOpcoes)

                            chk.Itens.Add(IC)

                        Next

                        If Par.ValorPadrao <> String.Empty Then
                            chk.ValorSelecionado = Par.ValorPadrao
                        End If

                        tab.Rows(Par.Linha - 1).Cells(Par.Coluna - 1).Controls.Add(chk)

                    Case eTipoObjetoBusca.RadioButtonCarga

                        Dim rdo As New RadioButtonCarga
                        rdo.ID = Par.NomeParametro
                        rdo.TipoValor = Par.TipoValor
                        rdo.Titulo = Par.Titulo
                        rdo.TituloCssClass = Par.TituloCssClass
                        rdo.CssClass = Par.CssClass
                        rdo.LarguraTitulo = Par.LarguraTitulo
                        rdo.PosicaoTitulo = Par.PosicaoTitulo
                        rdo.Width = Par.LarguraControle
                        rdo.Obrigatorio = Par.Obrigatorio


                        For Each IC As ItemCarga In Par.OpcoesToItemCarga(Par.ListaOpcoes)

                            rdo.Itens.Add(IC)

                        Next

                        If Par.ValorPadrao <> String.Empty Then
                            rdo.ValorSelecionado = Par.ValorPadrao
                        End If
                        tab.Rows(Par.Linha - 1).Cells(Par.Coluna - 1).Controls.Add(rdo)

                End Select

            Next

            If Me.strMetodoListagem <> String.Empty Then

                If bolExibirBotaoBusca Then
                    tab.Rows.Add(New HtmlTableRow)
                    tab.Rows(tab.Rows.Count - 1).Cells.Add(New HtmlTableCell)
                    tab.Rows(tab.Rows.Count - 1).Cells(0).ColSpan = MaxCol
                    tab.Rows(tab.Rows.Count - 1).Cells(0).Controls.Add(Me.btnBuscar)
                    tab.Rows(tab.Rows.Count - 1).Cells(0).Align = "center"

                    Me.CarregarBotoesAuxiliares(tab.Rows(tab.Rows.Count - 1).Cells(0))

                End If

                tab.Rows.Add(New HtmlTableRow)
                tab.Rows(tab.Rows.Count - 1).Cells.Add(New HtmlTableCell)
                tab.Rows(tab.Rows.Count - 1).Cells(0).ColSpan = MaxCol
                tab.Rows(tab.Rows.Count - 1).Cells(0).Controls.Add(Me.lblMensagem)
                tab.Rows(tab.Rows.Count - 1).Cells(0).Align = "center"

            End If
        End If
    End Sub

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)

        Me.AtualizarEstruturaGrid()


    End Sub

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

        'Dim PaginaPai As Componentes.Page

        'If TypeOf Me.Page Is Componentes.Page Then

        '    'PaginaPai = Me.Page

        '    If TypeOf Me.Page Is Componentes.Page Then

        '        'PaginaPai = Me.Page

        '    End If

        'End If

        Me.arrControlesDestinos.CarregarObjetosDestinos()


    End Sub

    Public Sub CarregarBusca()

        Dim PaginaPai As Componentes.Page
        Page.Validate()

        If TypeOf Me.Page Is Componentes.Page And Me.Page.IsValid Then

            PaginaPai = Me.Page

            Dim arrValPar() As Object

            ReDim arrValPar(Me.Parametros.Count - 1)

            For Each Par As ItemParametro In Me.Parametros

                Select Case Par.TipoObjeto

                    Case eTipoObjetoBusca.TextBoxCarga

                        Dim txt As TextBoxCarga
                        txt = Me.FindControl(Par.NomeParametro)

                        arrValPar(Me.Parametros.IndexOf(Par)) = txt.Text

                    Case eTipoObjetoBusca.DropDownListCarga

                        Dim ddl As DropDownListCarga
                        ddl = Me.FindControl(Par.NomeParametro)

                        Select Case Par.TipoValor

                            Case eTipoValor.Logico
                                arrValPar(Me.Parametros.IndexOf(Par)) = CBool(ddl.ValorSelecionado)

                            Case Else
                                arrValPar(Me.Parametros.IndexOf(Par)) = ddl.ValorSelecionado

                        End Select


                    Case eTipoObjetoBusca.CheckBoxCarga

                        Dim chk As CheckBoxCarga
                        chk = Me.FindControl(Par.NomeParametro)

                        Select Case Par.TipoValor
                            Case eTipoValor.Logico
                                arrValPar(Me.Parametros.IndexOf(Par)) = CBool(chk.ValorSelecionado)

                            Case Else
                                arrValPar(Me.Parametros.IndexOf(Par)) = chk.ValorSelecionado
                        End Select

                    Case eTipoObjetoBusca.RadioButtonCarga

                        Dim rdo As RadioButtonCarga
                        rdo = Me.FindControl(Par.NomeParametro)

                        Select Case Par.TipoValor
                            Case eTipoValor.Logico
                                arrValPar(Me.Parametros.IndexOf(Par)) = CBool(rdo.ValorSelecionado)

                            Case Else
                                arrValPar(Me.Parametros.IndexOf(Par)) = rdo.ValorSelecionado
                        End Select


                    Case eTipoObjetoBusca.QueryString

                        arrValPar(Me.Parametros.IndexOf(Par)) = Current.Request.QueryString(Par.NomeParametro)

                    Case eTipoObjetoBusca.Session

                        arrValPar(Me.Parametros.IndexOf(Par)) = Current.Session(Par.NomeParametro)

                End Select

            Next

            If Me.strMetodoListagem <> String.Empty Then

                objDataSource = PaginaPai.InvocarMetodoObjetoBase(Me.strMetodoListagem, arrValPar)


                If PaginaPai.ERRO.NUMERO = Erro.Tipo.SemErro Then

                    If TypeOf objDataSource Is DataTable Or Me.strDataTable = String.Empty Then

                        objDataTableSource = CType(objDataSource, DataSet).Tables(0)

                    Else

                        objDataTableSource = CType(objDataSource, DataSet).Tables(strDataTable)

                    End If

                Else

                    Me.lblMensagem.Text = PaginaPai.ERRO.MENSAGEM

                End If

            End If

        End If
    End Sub

    Private Sub CarregarGrid()

        Dim bolDataSourceVazio As Boolean = False

        Me.gvGrid.DataSource = objDataTableSource

        If Not objDataTableSource Is Nothing Then

            If objDataTableSource.Rows.Count = 0 Then
                objDataTableSource.Rows.Add(objDataTableSource.NewRow)
                bolDataSourceVazio = True
            End If

        End If
        Me.gvGrid.DataBind()

        If bolDataSourceVazio Then
            Me.gvGrid.Rows(0).Visible = False
        End If

    End Sub

    Public Overrides Sub DataBind()

        If TypeOf objDataSource Is DataSet And Me.strDataTable = String.Empty Then

            objDataTableSource = CType(objDataSource, DataSet).Tables(0)


        ElseIf TypeOf objDataSource Is DataSet And Me.strDataTable <> String.Empty Then

            objDataTableSource = CType(objDataSource, DataSet).Tables(strDataTable)

        ElseIf TypeOf objDataSource Is DataTable Then

            objDataTableSource = objDataSource

        End If

        Me.CarregarGrid()

    End Sub


    Private Sub btnBuscar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBuscar.Click

        Me.lblMensagem.Text = ""
        Me.lblMensagem.ForeColor = Drawing.Color.Red

        If Me.Page.IsValid Then
            Me.CarregarBusca()
            Me.CarregarGrid()
        End If

    End Sub

    Private arrTotais As New ArrayList

    Private Structure TotalColuna
        Public NomeColuna As String
        Public Total As Double
    End Structure

    Private Sub gvGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvGrid.RowDataBound

        If e.Row.RowType = DataControlRowType.Header Then

            For Each col As ItemColuna In Me.Colunas

                If col.Totalizar Then

                    Me.gvGrid.ShowFooter = True

                    Dim Tot As TotalColuna
                    Tot.NomeColuna = col.NomeColuna
                    Tot.Total = 0
                    Me.arrTotais.Add(Tot)

                End If

            Next


        ElseIf e.Row.RowType = DataControlRowType.DataRow Then


            Dim arrTot As New ArrayList

            For Each Tot As TotalColuna In arrTotais

                Try
                    Tot.Total = Tot.Total + e.Row.DataItem(Tot.NomeColuna)
                    arrTot.Add(Tot)
                Catch

                End Try
            Next

            arrTotais = arrTot.Clone()

        ElseIf e.Row.RowType = DataControlRowType.Footer Then

            For Each Tot As TotalColuna In arrTotais

                Dim lblTotal As Label

                lblTotal = e.Row.FindControl("lblTotal" & Tot.NomeColuna)

                lblTotal.Text = Tot.Total

                For Each col As ItemColuna In Me.Colunas

                    If col.NomeColuna = Tot.NomeColuna Then

                        lblTotal.Text = Diversos.FormatarValor(Tot.Total, col.FormatoApresentacao)
                        lblTotal.Font.Bold = True

                    End If

                Next

            Next

        End If

    End Sub

    Private Sub GridBusca_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

        If Not Me.DesignMode Then

            Me.pnl.CssClass = "ContainerGrid"


            If strLargura <> Nothing Then
                Me.pnl.Style.Add("width", strLargura.ToString)
            End If
            If strAltura <> Nothing Then
                Me.pnl.Style.Add("height", strAltura.ToString)
            End If

            Me.pnl.Style.Add("border", "1px solid")

            If strLargura <> Nothing And strAltura <> Nothing Then
                Me.pnl.Style.Add("display", "block")
                Me.pnl.Style.Add("overflow", "auto")
            End If

        End If


    End Sub
End Class



